{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lecture 5 \n",
    "\n",
    "## Randomized algorithms and quicksort."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from auxFileLecture5 import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's a quick-and-dirty implementation of quickSort"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def dumbQuickSort(A):\n",
    "    if len(A) <= 1:\n",
    "        return A\n",
    "    L = []\n",
    "    R = []\n",
    "    p = choice(range(len(A))) # random pivot\n",
    "    E = [A[p]] # this is a list of all the things that are equal to the pivot.\n",
    "    for i in range(len(A)):\n",
    "        if i == p:\n",
    "            continue\n",
    "        if A[i] < A[p]:\n",
    "            L.append(A[i])\n",
    "        elif A[i] > A[p]:\n",
    "            R.append(A[i])\n",
    "        else:\n",
    "            E.append(A[i])\n",
    "    return dumbQuickSort(L) + E + dumbQuickSort(R)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 1, 2, 3, 4, 4, 6, 6, 23]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# sanity check\n",
    "A = [1,4,1,23,6,6,3,2,4]\n",
    "dumbQuickSort(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And here's are two slicker implementations that don't initialize a separate L and R list.  (So they use less memory)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "## First, a few helper functions:\n",
    "\n",
    "# swap A[i] with A[j]\n",
    "def swap(A, i, j):\n",
    "    tmp = A[i]\n",
    "    A[i] = A[j]\n",
    "    A[j] = tmp\n",
    "\n",
    "# Here's one in-place Partition algorithm. This is the one in CLRS\n",
    "def partition1(A, start, end, p):\n",
    "    # first put the pivot at the end\n",
    "    x = A[p]\n",
    "    swap(A, p, end-1)\n",
    "    # now do the algorithm described in CLRS (see the textbook for explanation)\n",
    "    i = start - 1\n",
    "    for j in range(start, end-1):\n",
    "        if A[j] <= x:\n",
    "            i += 1\n",
    "            swap(A, i, j)\n",
    "    # at this point all of the things <=i are smaller than the pivot, and > i are larger\n",
    "    # so put the pivot back where it needs to go.\n",
    "    swap(A, i+1, end-1)\n",
    "    return i+1\n",
    "\n",
    "\n",
    "# Here is a different in-place Partition algorithm.  This was the original one introduced by Hoare.\n",
    "def partition2(A, start, end, p):\n",
    "    # first swap to put the pivot at the end\n",
    "    x = A[p]\n",
    "    swap(A, p, end-1)\n",
    "    # walk pointers up and down the array in opposite directions, switching things until they are in the right place.\n",
    "    leftP = start\n",
    "    rightP = end-1 \n",
    "    while True:\n",
    "        while leftP < end-1 and A[leftP] <= x:\n",
    "            leftP += 1\n",
    "        while rightP > start and A[rightP] >= x:\n",
    "            rightP -= 1\n",
    "        if leftP >= rightP:\n",
    "            break\n",
    "        # now switch them.\n",
    "        swap(A, leftP, rightP)\n",
    "    # now put the pivot value in the right place and return that location\n",
    "    swap(A, end-1, leftP)\n",
    "    return leftP\n",
    "        \n",
    "# Finally, the quickSort algorithm.  \n",
    "# In addition to A, it also takes an optional input \"partition\" which is which partition function to use.\n",
    "def quickSort(A, partition=partition1):\n",
    "    return quickSortHelper(A, 0, len(A), partition)\n",
    "        \n",
    "def quickSortHelper(A, start, end, partition):\n",
    "    if end - start <= 1:\n",
    "        return \n",
    "    # choose a random pivot:\n",
    "    p = choice(range(start, end)) \n",
    "    # partition around the pivot:\n",
    "    pivotLocation = partition( A, start, end, p ) \n",
    "    # recurse:\n",
    "    quickSortHelper(A,start, pivotLocation ,partition)\n",
    "    quickSortHelper(A,pivotLocation + 1, end, partition)\n",
    "    return\n",
    "\n",
    "# define two versions of quicksort, one for each partition function, so we can compare later.\n",
    "def quickSort1(A):\n",
    "    return quickSort(A, partition1)\n",
    "def quickSort2(A):\n",
    "    return quickSort(A, partition2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 234]\n",
      "[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 234]\n"
     ]
    }
   ],
   "source": [
    "# sanity check\n",
    "A = [5,4,2,3,1,1,2,3,4,5,234]\n",
    "quickSort1(A)\n",
    "print(A)\n",
    "quickSort2(A)\n",
    "print(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's compare both our implementations to mergeSort"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "nVals = range(50, 3050, 100)\n",
    "nValsMerge, tValsMerge = trySortABunch(mergeSort, Ns=nVals, numTrials=75, listMax=100000)\n",
    "nValsQuick, tValsQuick = trySortABunch(quickSort1, Ns=nVals, numTrials=75, listMax=100000)\n",
    "nValsQuick2, tValsQuick2 = trySortABunch(quickSort2, Ns=nVals, numTrials=75, listMax=100000)\n",
    "nValsQuickDumb, tValsQuickDumb = trySortABunch(dumbQuickSort, Ns=nVals, numTrials=75, listMax=100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FFXXwH83IRAg9CACoUtPhRAIiJRIFVRAAUUEpL2+\nIlIE/BQBXxVpUlVEpSpNUBCwIQgC0kLvvUvvISEh5Xx/3M0aUjckm025v+eZZ3fm3rlzZjaZc8sp\nSkQwGAwGQ87FydECGAwGg8GxGEVgMBgMORyjCAwGgyGHYxSBwWAw5HCMIjAYDIYcjlEEBoPBkMMx\nisBgyGIopcoqpe4ppZxTqNdYKXUho+QyZF2MIjCkCqXUGaXUA6WUe7zju5VSopQq7yC53lVKnba8\nIC8opRanoa1RSqnv0lO+eO3nUUp9opQ6p5S6r5Q6rpR6WymlbDlfRM6JiJuIRKdRjizzzAz2xSgC\nw6NwGngpdkcp5QXke9TGlFK50iKMUqob0BV4WkTcAH9grSNksZElQBDQGiiAlr0v8GkGXBvIks/M\nYE9ExGxms3kDzgDDgeA4xyYA7wEClLccy2M5fg64AnwJ5LWUNQYuAMOAy8C3luNDgUvARaCXpb0n\nbGjvM2ByMjKXAlYAN4ETQO84ZaOApcB3wF2gH/AAiATuAXsTaW8YsDTesSnAVBueXxAQDpSJd7wu\nEA1UjPOcn44n53eW7+UtzyaXZb8oMNvy3G4By+M+5zht9AcOAR4Z/czMlrk3MyIwPApbgYJKqeqW\neerO6JdCXMYAVQBf4AmgNDAiTvnj6BdYOaCPUqolMAh42lK/cSra2wq8qpQaopTyT2TufBFa8ZQC\nXgBGK6Waxil/Dv1iKwzMBEYDi0VPv/gkcv+LgNZKqQIAlut1BBYkUjc+zYBtInI+7kER2WaRMciG\nNuLzLXpEVhN4DJgUv4JSagTQHWgkIhfI+GdmyMQYRWB4VL4FXkW/2A4D/8QWWOa6+wADReSmiISg\nXxSd45wfA4wUkQgRuY9+kc4WkYMiEobuddrUnoh8B7wJtAD+Aq4qpYZZzi0DNACGiUi4iOwBvrHI\nHssWEVkuIjEWWZJFRM4Cu4B2lkNNgTAR2ZriUwN39KgnMS4BxW1ow4pSqiTQCviPiNwSkUgR+evh\nKmoi0BxoIiLXLPeQoc/MkLkxc3uGR+VbYANQAZgXr6w4uoe6M876pwLi9jqviUh4nP1SwI44+3F7\nzCm2JyLzgflKKRfgecv3PcBtIFZ5xHIWPSee2LVsZQF6nWQe8DK2jQYArgOVkygraSlPDWXQ93cr\nifLCaCXaSUTuxC1wwDMzZFLMiMDwSFh6xafRC54/xiu+DtwHaopIYctWSPSipLWJeOdcQs9dx1Im\nle3FyhUpIkuAfYAnet68aOw0joWyxBnBJCKLLSF5lwCNlVIe6JGBrYpgDVDX0uu2opSqa5Ertjcf\nysML8I8n0d559P0VTqL8FtAGmK2UapBYhQx8ZoZMilEEhrTQE2gqIqFxD4pIDPA1MEkp9RiAUqq0\nUqpFMm19D/SwrDvkA963tT2lVHel1DNKqQJKKSelVCv0fHnsXPxm4BOllKtSytsid3KmjleA8kqp\nJP8/LFMs69GLtKdF5HAy7cU9bw3aOucHpVRNpZSzUqqeRZ55InLUUnUP0Fkp5aKU8kfP0yfW3iXg\nV+ALpVQRS/2n4tVZD3QBflRKBYBjnpkh82J+NMMjIyInRWRHEsXD0NYmW5VSd9E94arJtPUrMBVY\nF3uepSjChvbuAu+iLYpuA+OA10Vkk6X8JbSlzUVgGXptYk0yt7bE8nlDKbUrmXoL0IvbD40GlFJf\nKqW+TOa8Duj7/A1tQbTF8r1PnDrvA5XQPfoP4l8jHl3RFjtHgKvAgPgVROQP4DVgpVKqFo57ZoZM\niBIxIzpD5kMpVR04AOQRkShHy2NPlFJz0Wskz4jIA0fLY8h5mBGBIdOglGpn8botAowFVmZ3JWCh\nF3qEU8vRghhyJmZEYMg0KKV+AwLRjlV/Af+1zIEbDAY7YhSBwWAw5HDM1JDBYDDkcLKEQ5m7u7uU\nL1/e0WIYDAZDlmLnzp3XRSRFb/UsoQjKly/Pjh1JWSkaDAaDITGUUmdtqWemhgwGgyGHYxSBwWAw\n5HCMIjAYDIYcTpZYI0iMyMhILly4QHh4eMqVDYYciKurKx4eHri4uDhaFEMmJ8sqggsXLlCgQAHK\nly+PjaleDYYcg4hw48YNLly4QIUKFRwtjiGTk2WnhsLDwylWrJhRAgZDIiilKFasmBkxG2wiyyoC\nwCgBgyEZzP+HwVaytCIwGAwGQ9oxisBBjBo1itKlS+Pr60vlypVp3749hw4dSrf2y5cvz/XrCbMe\njho1CqUUJ06csB6bPHkySim7O+3FxMTQv39/PD098fLyok6dOpw+fTpVbUyePJmwsDA7SWgw5EyM\nInAgAwcOZM+ePRw/fpxOnTrRtGlTrl27Zvfrenl5sWjRIuv+kiVLqFmzZqraiI6OTvV1Fy9ezMWL\nF9m3bx/79+9n2bJlFC6cVIbFxK9pFIEhzUyfDkrBkiUp180hGEWQBs6cOUO1atXo3r07VapUoUuX\nLqxZs4YGDRpQuXJltm/fTuXKla0v95iYGJ544olEX/adOnWiefPmLFigE1HF7dHv2LGDxo0bA7pH\n361bNxo2bEi5cuX48ccfGTp0KF5eXrRs2ZLIyEhrm+PGjcPLy4uAgICHRgDPP/88P/30EwAnT56k\nUKFCuLu7W8tXr15NYGAgtWrV4sUXX+TevXtWmYYNG0atWrVYsmQJwcHBeHt74+vry5AhQ/D09AT0\nC3vIkCHUqVMHb29vZsyYAcClS5coWbIkTk76z87Dw4MiRYoAsHDhQry8vPD09GTYsGFWWdzc3Bg8\neDA+Pj58/PHHXLx4kSZNmtCkSZNH/dkMOZ3Yke+HHzpWjkxE9lEEjRsn3L74QpeFhSVePmeOLr9+\nPWGZjZw4cYLBgwdz5MgRjhw5woIFC9i0aRMTJkxg9OjRvPLKK8yfPx+ANWvW4OPjQ/HiiceAqlWr\nFkeOHEnxmidPnuTPP/9kxYoVvPLKKzRp0oT9+/eTN29efv75Z2u9QoUKsX//fvr168eAAf9mLyxY\nsCBlypThwIEDLFq0iE6dOlnLrl+/zkcffcSaNWvYtWsX/v7+TJw40VperFgxdu3aRefOnenRowcz\nZsxgz549ODs7W+vMnDmTQoUKERwcTHBwMF9//TWnT5+mY8eOrFy5El9fXwYPHszu3bsBuHjxIsOG\nDePPP/9kz549BAcHs3z5cgBCQ0OpW7cue/fuZcSIEZQqVYp169axbt06W34egyEh+/bpzwMH4O5d\nx8qSScg+isBBVKhQAS8vL5ycnKhZsyZBQUEopfDy8uLMmTO89tprzJs3D4BZs2bRo0ePJNuyNTdE\nq1atcHFxwcvLi+joaFq2bAlgvWYsL730kvVzy5YtD7XRuXNnFi1axPLly2nXrp31+NatWzl06BAN\nGjTA19eXuXPncvbsv3GrYpXG7du3CQkJITAwEICXX37ZWmf16tXMmzcPX19f6taty40bNzh+/Dge\nHh4cPXqUTz75BCcnJ4KCgli7di3BwcE0btyY4sWLkytXLrp06cKGDRsAcHZ2pkOHDjY9F4MhRaKj\n4eBBqFkTRGDbNkdLlCnIsg5lCVi/PumyfPmSL3d3T748GfLkyWP97uTkZN13cnIiKiqKMmXKUKJE\nCf7880+2b99uHR0kxu7du/H39wcgV65cxMTEACSwBY97DRcXF6uZYOw1Y4lrPhjflLBNmzYMGTIE\nf39/ChYsaD0uIjRr1oyFCxcmKmP+/PmTlD9uG9OmTaNFixYJyvLkyUOrVq1o1aoVJUqUYPny5Tz9\n9NNJtuXq6vrQaMNgSBMnT8L9+9CrFwwaBFu2QLNmjpbK4ZgRQQbQq1cvXnnlFV588cUkX2o//PAD\nq1evtvbiy5cvz86dO61lj8LixYutn7E991jy5cvH2LFjee+99x46Xq9ePf7++2/rmkJoaCjHjh1L\n0HbhwoUpUKAA2yw9qriLzy1atGD69OnW9Ypjx44RGhrKrl27uHjxIqDXS/bt20e5cuUICAjgr7/+\n4vr160RHR7Nw4UIaNWqU6D0VKFCAkJCQR3kcBoMeBbz0kn7516gBwcGOlihTkH1GBJmYZ599lh49\neiSYFpo0aRLfffcdoaGheHp68ueff1rXD0aOHEnPnj15//33rQvFqeXWrVt4e3uTJ0+eRHv4nTt3\nTnCsePHizJkzh5deeomIiAgAPvroI6pUqZKg7syZM+nduzdOTk40atSIQoUKAVrxnTlzhlq1aiEi\nFC9enOXLl3P16lV69+5tbTcgIIB+/frh6urKmDFjaNKkCSLCM888w3PPPZfoPfXp04eWLVta1woM\nhlRRtSpYDDL4+WcoWdKx8mQSskTOYn9/f4lv43748GGqV6/uIIlSx44dOxg4cCAbN250tCjpyr17\n93BzcwNgzJgxXLp0iSlTpjhYKkNcstL/SYZw9y7EmQrN7iildoqIf0r1zNSQnRkzZgwdOnTgk08+\ncbQo6c7PP/+Mr68vnp6ebNy4keHDhztaJIMhefz84LXX9PewMBg4UI8McjhmRGAwZGPM/0kc7t2D\nAgW0/8Dw4RATow1FOnSAr792tHR2wYwIDAaDIS4HDuhPLy/96eQE9eppy6EcjlEEBoMhZ7B/v/70\n9v73WGAgHDoEd+44RqZMglEEBoMhZ7BvH7i5Qbly/x4LDDSOZRjzUYPBkFNo0wYqV9ZTQrEEBGgT\n0hs3HCdXJsBuIwKllKtSartSaq9S6qBS6gPL8aJKqT+UUsctn0XsJUNmxlFhqAG++uorqlWrRrVq\n1fD392e9DV7VK1asYMyYMUmWnzlzxhp0Li5hYWF06dLFGlDuySeftAaxs5XRo0enqr7BkCgtWkD/\n/g8fK1gQ/vlHO5nlYOw5NRQBNBURH8AXaKmUqge8A6wVkcrAWst+jsQRYahXrVrFjBkz2LRpE0eO\nHOGrr77ilVde4Z9//kn2vGeffZZ33kn9TzVlyhRKlCjB/v37OXDgADNnzrQ5mbqIEBMTYxSBIe2E\nhMCuXWBxZnwIk8nNfopANLFdPxfLJsBzwFzL8bnA8/aSwd5kxTDUY8eOZfz48daw07Vq1aJHjx58\n/vnnyV53zpw59OvXD4ArV67Qrl07fHx88PHxYfPmzQ/dy6lTp/Dz8yM4OJhLly5RunRpa1nVqlWt\nsZImTpyIp6cnnp6eTJ482fpMq1atyquvvoqnpyc9e/bk/v37+Pr60qVLl0f5mQwG2LQJateG7dsT\nlm3cCE88oReNcyh2XSNQSjkDO4EngM9FZJtSqoSIXLJUuQyUSOLcPkAfgLJlyyZ7nQEDYM+edBMb\nAF9fsLybkuXEiRMsWbKEWbNmUadOHWsY6hUrVjwUhnrAgAHpGoZ63bp1HDp0iMDAQH744QfGjRtH\nu3bt+Pnnn3n+ea1bY8NQz5s3jwEDBrBq1SoOHjxI7dq1H2rP39+f2bNnp3yzFvr370+jRo1YtmwZ\n0dHR3Lt3j1u3bgFw9OhROnfuzJw5c/Dx8cHFxYXmzZuzdOlSgoKC6NatG5UrV2bnzp3Mnj2bbdu2\nISLUrVuXRo0aUaRIEY4fP87cuXOpV68eoBPn7EnvH9iQs4gNPR1rOhqXxx7Twei2bNHxh3IgdrUa\nEpFoEfEFPIAApZRnvHJBjxISO/crEfEXEf+kXpyZgawahjot/Pnnn7z++uuADhMdG2Po2rVrPPfc\nc8yfPx8fHx8AfH19OXXqFEOGDOHmzZvUqVOHw4cPs2nTJtq1a0f+/Plxc3Ojffv21hAc5cqVsyoB\ngyFd2LcPypSBxDLiVakCRYvmaH+CDLEaEpHbSql1QEvgilKqpIhcUkqVBK6mtX1beu72IquFoa5R\nowY7d+6kadOm1rKdO3fadN2UKFSoEGXLlmXTpk3UiNOzin3Rt2/fHicnJ3755Rdy5Ur6T8+WUNcG\nQ6rYv/9h/4G4KJXjHcvsaTVUXClV2PI9L9AMOAKsALpZqnUDfrKXDJmFzBSGeujQoQwbNowbFnO5\nPXv2sGzZMvr27WvzdYOCgpg+fTqg01LesTjj5M6dm2XLljFv3jzrWsfff/9tnTZ68OABhw4doly5\ncjRs2JDly5cTFhZGaGgoy5Yto2HDholez8XF5aG1D4MhVTx4AIcPJz4tFEv9+nqNwPK3mtOw54ig\nJDDXsk7gBHwvIquUUluA75VSPYGzQEc7ypApyExhqJ999lkuXrxIgwYNiIqK4vLly+zduzdV150y\nZQp9+vRh5syZODs7M336dEpawvnmz5+fVatW0axZM9zc3Lh9+zavv/661QLomWeeoUOHDiil6N69\nOwEBAYBWln5+fg9NbcXSp08fvL29qVWrVrIjKoMhUZSCX34BD4+k6zRrBqdP60B0RXKeRbsJOpcB\nZNYw1FFRUfTo0YOYmBi+++67BFnMDFmfrPR/Ykh/bA06ZzyL7cyYMWOYPn16puzJ5sqVi2+//dbR\nYhgM9mXdOj09lEjq1IeIidHOZWXKZIxcmQgTa8jOvPPOO5w9e5Ynn3zS0aIYDDmT8eNh2LCU6w0a\nBJ6eWiHkMIwiMBgM2Zt9+5JfKI6lVi2dwSwHOpYZRWAwGLIvN2/q6Z6kTEfjYrGsy4lmpEYRGAyG\n7EtiOQiS4okndMYyowgMBoMhGxGrCGyZGlJKjwqMIjCkhvr166dYp3HjxlStWhUfHx8aNGjA0aNH\nrcfjm8SmlYMHD9K0aVOqVq1KpUqVGDlypNVLODlSuo+kZJ01axZeXl54e3vj6enJTz+lzjdw+fLl\nNofe/vXXX/H396dGjRr4+fkxePBgQAfhmzBhQoL6zs7O+Pr64unpSdu2bbl9+zagA//1798fT09P\nvLy8qFOnDqdPn05wflK/26Pe24gRI1izZg0AkydPJiwszFrWunVrq3yGdKZvXzh4UOccsIVBg2Ds\nWPvKlBkRkUy/1a5dW+Jz6NChBMcyI40aNZLg4GAREZkxY4a0bds2wfH0ICwsTCpWrCi///67iIiE\nhoZKy5YtZeLEiWluOzFZz58/LxUrVpTbt2+LiEhISIicOnXK5jYjIyOlW7dusmTJkhTr7t+/XypW\nrCiHDx8WEZGoqCj54osvRERk5MiRMn78+ATn5M+f3/r91VdflY8++khERBYsWCAdOnSQ6Oho633c\nvHkzwflJ/W7pcW/lypWTa9eu2dxeWsgq/ycG+wDsEBvesWZEkAbc3NwAWL9+PY0bN+aFF16gWrVq\ndOnSJdEAck899ZQ1HHRcXn/9dfz9/alZsyYjR460Hg8ODqZ+/fr4+PgQEBBASEgI0dHRDBkyhDp1\n6uDt7c2MGTMAWLBgAQ0aNKB58+YA5MuXj88++4zx48cDCXvOnp6eVi/e2PsAHabay8sLHx+fBPkH\nYmJi6N69O8OHD+fq1asUKFDAeq6bmxsVKlQAdNiKevXq4e3tTbt27awhJho3bsyAAQPw9/dn7Nix\nrFixgiFDhuDr68vJkyeTfM7jxo3jvffeo1q1aoDu7ccGvbOFwMBAa76FS5cuUbJkSZwsWao8PDwo\nkoInadzf7X//+x916tTB09OTPn36WH/nlO6te/fuLF26lKlTp3Lx4kWaNGlCkyZNgIdDfycVmrt6\n9er07t2bmjVr0rx5c+7fv2/z/edYYmJ0aOK//07deZs367DVOYhs41DWeE7jFOu0qdKGt+u/ba3f\n3bc73X27cz3sOi98/8JDddd3X5+q6+/evZuDBw9SqlQpGjRowN9//53Ad2DlypV4JTJX+fHHH1O0\naFGio6MJCgpi3759VKtWjU6dOrF48WLq1KnD3bt3yZs3LzNnzqRQoUIEBwcTERFhffknFl66UqVK\n3L9/3+Zph19//ZWffvqJbdu2kS9fPm7evGkti4qKokuXLnh6evLee+8RHR1NiRIlqFChAkFBQbRv\n3562bdsC8OqrrzJt2jQaNWrEiBEj+OCDD6wvtQcPHlinmY4fP06bNm144YUXEgoThwMHDlinglJL\ndHQ0a9eupWfPngB07NiRJ598ko0bNxIUFMQrr7yCn59fsm3E/d369evHiBEjAOjatSurVq2y3rct\n99a/f38mTpzIunXrrDkhYkkpNPfChQv5+uuv6dixIz/88AOvvPLKIz2THMOZMzBlivYNaNDA9vPe\neAOKFQPLVF5OwIwI0omAgAA8PDxwcnLC19f3oZg5Xbp0wdfXl7///jvR+ezvv/+eWrVq4efnx8GD\nBzl06BBHjx6lZMmS1KlTB4CCBQuSK1cuVq9ezbx58/D19aVu3brcuHGD48ePp8s9rFmzhh49epAv\nXz4AihYtai3r27evVQmA7pX/9ttvLF26lCpVqjBw4EBGjRrFnTt3uH37No0aNQKgW7dubNiwwdpO\np06d0kXWlIhNZvP4449z5coVmjVrBugRwNGjR/nkk09wcnIiKCiItWvXJtpGYr/bunXrqFu3Ll5e\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x110957438>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot( nValsMerge, tValsMerge, \"--\", color=\"red\", label=\"myDumbMergeSort\" )\n",
    "plt.plot( nValsQuickDumb, tValsQuickDumb, color=\"blue\", label=\"myDumbQuickSort\" )\n",
    "plt.plot( nValsQuick, tValsQuick, \"-.\", color=\"green\", label=\"inPlaceQuickSort, CLRS Partition\" )\n",
    "plt.plot( nValsQuick2, tValsQuick2, \":\", color=\"purple\", label=\"inPlaceQuickSort, Hoare Partition\" )\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.legend()\n",
    "plt.title(\"MergeSort v. QuickSort\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
